package com.wyd.command;

import com.wyd.command.cmd.Command;
import com.wyd.command.cmd.NoCommand;

import java.util.ArrayList;
import java.util.List;

/**
 * 各接收者的执行方法各异，无法直接抽象，若直接针对接收者编程，将会面向实现编程，耦合度过高
 *
 * 将执行方法封装为 Command，并针对 Command 进行编程
 *
 * @author Yudi Wang
 * @date 2022/1/27 16:08
 */
public class Invoker {
    /**
     * 可执行命令列表
     */
    private List<Command>  commands = new ArrayList<Command>();
    /**
     * 上一次执行的命令，用于撤回
     */
    private Command lastTimeCommand = new NoCommand();


    public List<Command> getCommands() {
        return commands;
    }

    public Invoker(int commandCnt) {
        for (int i = 0; i < commandCnt; i++) {
            commands.add(new NoCommand());
        }
    }


    public void pressUndoButton(){
        lastTimeCommand.undo();
    }

    public void pressButton(int commandNum){
        Command command = commands.get(commandNum);
        command.execute();
        lastTimeCommand = command;
    }
}
